#include <iostream>
#include <unistd.h>
#include <signal.h>
#include <cstdlib>
#include <sys/wait.h>
void WaitAll(int signum)
{
    while (true)
    {
        waitpid(-1, nullptr, WNOHANG);//阻塞了
        int n = waitpid(-1, nullptr, WNOHANG);
        if (n == 0)
            break;
        else if (n < 0)
        {
            std::cout << "waitpid error" << std::endl;
            break;
        }
    }
    // while(true)
    // {
    //     int n = waitpid(-1,nullptr,WNOHANG);
    //     if(n == 0)break;
    //     else if(n < 0)
    //     {
    //         std::cout << "waitpid error"<<std::endl;
    //         break;
    //     }
    // }
    std::cout << "father get a signal:" << signum << std::endl;
}
int main()
{
    signal(SIGCHLD, WaitAll);
    pid_t id = fork();
    for (int i = 0; i < 10; i++)
    {
        if (id == 0)
        {
            std::cout << "I am a child,exit" << std::endl;
            sleep(3);
            exit(3);
        }
        if(i <= 6)exit(3);
        else pause();
    }
    while(true)
    {
        sleep(1);
        std::cout << "I am parent,exit" << std::endl;
        
    }
    
    
    return 0;
}
// volatile int flag =0;
// void handler(int signum)
// {
//     std::cout<<"更改全局变量,"<<flag<<" -> 1"<<std::endl;
//     flag = 1;
// }
// int main()
// {
//     signal(2,handler);
//     while(!flag);
//     std::cout<<"process quit normal"<<std::endl;
//     return 0;
// }